"""
Author: Yishang
Description: 对于平湖市人民政府网页的检查
"""
import re
import logging
from io import BytesIO

from bs4 import BeautifulSoup
from datetime import datetime

from utils import filechecker
from .model import ProcessResult, WebParser


class PinghuParser(WebParser):
    regex_url = r"[https|http]://www\.pinghu\.gov\.cn.*"

    def __init__(self, *args, **kwargs):
        """
        平湖处理
        """
        super().__init__(*args, **kwargs)
        return

    def process(self):
        """
        开始自动处理

        :return:
        """
        result = []

        logging.info(f"正在进行自动处理链接 {self.url} ......")

        # 含有 download 的一般是附件，由于一些比较老的文字可能直接上传到图片文件夹去了，这里不予受理
        match = re.search(r""".*/module/download/downfile\.jsp.*""", self.url)
        if match:

            logging.info(f"检测到 {self.url} 属于可下载附件，准备检测是否有效（可下载、未加密）。")

            try:
                r = self.session.get(self.url)

                if r.status_code != 200:
                    result.append(self.summary_process(
                        valid=False,
                        reason=f"文章页面 {self.response.status_code} 。",
                        url=self.url
                    ))
                else:
                    IO = BytesIO(r.content)
                    r = filechecker.check_file(IO)
                    IO.close()
                    if not r['is_valid']:
                        result.append(self.summary_process(
                            valid=False,
                            reason=f"附件无效，无法被打开。",
                            url=self.url
                        ))
                    elif r['is_encrypted']:
                        result.append(self.summary_process(
                            valid=False,
                            reason=f"附件被加密，无法被打开。",
                            url=self.url
                        ))
                    else:
                        result.append(self.summary_process(
                            valid=True,
                            reason=f"附件正常可用。",
                            url=self.url
                        ))

            except TimeoutError as e:
                result.append(self.summary_process(
                    valid=False,
                    reason=f"附件下载超时，疑似附件无效。",
                    url=self.url
                ))

            return result

        # art 在其中的一般是文章，文章就要按照文章进行处理
        match = re.search(r".*/art/.*", self.url)
        if match:
            # Todo: 这里是文章处理的内容

            logging.info(f"检测到 {self.url} 属于文章页面，准备以文章处理。")

            valid, r = self.url_valid()
            result.append(r)
            if not valid:
                return result

            # 如果正确就进行文章解析处理
            info = self.article_parser()

            # 附件图片好像不是这么重要，反正都要全页扫描的

            # # 拿到内容之后，先测测附件是否有效
            # if len(info['附件']) != 0:
            #     logging.info(f"文章包含附件，准备检查附件有效性（可下载、未加密）。")
            #
            #     for attachment in info['附件']:
            #         result += PinghuParser(attachment,
            #                                session=self.session,
            #                                depth=self.depth + 1,
            #                                max_depth=self.max_depth,
            #                                forward_urls=self.forward_urls + [self.url],
            #                                already_urls=self.forward_urls.append(self.url),
            #                                ).process()
            #
            # # 拿到内容之后，先测测图片是否有效
            # if len(info['图片']) != 0:
            #     logging.info(f"文章包含图片，准备检查图片有效性。")
            #
            #     for attachment in info['图片']:
            #         result += PinghuParser(attachment,
            #                                session=self.session,
            #                                depth=self.depth + 1,
            #                                max_depth=self.max_depth,
            #                                forward_urls=self.forward_urls + [self.url],
            #                                already_urls=self.already_urls.append(self.url),
            #                                ).process()

            return result

        # 最后一定要获取regx的内容，不然递归了
        match = re.search(self.regex_url, self.url)
        if match:
            return result + self.search()

        # 没有匹配交给分配
        result += super().process()

        return result

    def article_parser(self):
        """
        文章解析器，可以解析到文章所有内容。

        :return:
        """
        if self.response is None:
            self.response = self.session.get(self.url)

        info = {}

        soup = BeautifulSoup(self.response.content.decode(), 'lxml')

        # 标题
        info['标题'] = soup.find('td', class_='title').get_text(strip=True)

        # 标题下面的内容
        for li in soup.find('tr', class_='pc_ly').find_all('li'):
            key = (li.get_text(strip=True)
                   .replace('\n', '')
                   .replace('\t', '')
                   .replace('\r', '')
                   .replace(' ', ''))

            match = re.match(r'(.*)：(.*)', key)

            if match is None:
                continue

            key = match.group(1)
            value = match.group(2)

            # 转化为时间标准格式
            if '时间' in key:
                value = datetime.strptime(value, "%Y-%m-%d%H:%M")
            # 对于浏览次数单独处理
            elif '浏览次数' in key:
                # document.write("604");
                _ = self.session.get("https://www.pinghu.gov.cn/" + li.find('script').attrs['src']).text
                value = re.match(r'document.write\("(.*)"\).*', _).group(1)

            info[key] = value

        # 找一下有没有解读
        jd_list = [
            '查看文字解读',
            '查看原文',
            '意见征集',
            '查看图解'
        ]
        jd = []
        for span in soup.find('tr', class_='pc_ly').find_all('span'):
            if span.text.strip() in jd_list:
                jd.append({'方式': span.text, '链接': span.parent.attrs['href']})

        # 信息公开
        info['信息公开'] = {}

        labels = soup.find_all('li', class_='xxgk_th')
        values = soup.find_all('li', class_='xxgk_td')

        # 组合 key-value
        for label, value in zip(labels, values):
            key = label.get_text(strip=True).replace("：", "")  # 去掉冒号
            info['信息公开'][key] = value.get_text(strip=True)

        if '有效性' in info['信息公开'] and info['信息公开']['有效性'] == '':
            del info['信息公开']['有效性']

        if '成文日期' in info['信息公开']:
            info['信息公开']['成文日期'] = datetime.strptime(info['信息公开']['成文日期'], "%Y-%m-%d")

        # 获取正文
        content_soup = soup.find('td', 'bt_content')
        content_mark = []

        content = ''

        for p in content_soup.find_all('p'):
            content_mark.append(str(p))
            content += p.get_text(strip=True) + '\n'

        images = []  # 一行一个图片链接

        # 获取图片
        for img in content_soup.find_all('img'):
            # 对于没有加域名或者是开头为 // 的进行处理
            src = img.get('src')
            if 'module/jslib/icons' in src:
                continue

            if src.startswith('/'):
                if src.startswith('//'):
                    images.append('http:' + src)
                else:
                    images.append('https://www.pinghu.gov.cn' + src)
            else:
                images.append(src)

        # 另外搜索附件，因为可能存在只放了一个PDF浏览器的情况
        attachments = []  # 一行一个附件链接
        for match in re.finditer(r"""['|"]([^'|"]*/module/download/downfile\.jsp[^'|"]*)['|"]""", str(content_soup)):
            src = 'https://www.pinghu.gov.cn' + match.group(1).replace('&amp;', '&')
            if src.endswith('filename=') or src.endswith('classid='):  # 不全的去掉
                continue
            attachments.append(src)

        info['内容'] = content
        info['内容标记'] = content_mark
        info['图片'] = images
        info['附件'] = attachments
        info['解读'] = jd

        return info
